﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BolsaTalentos.DataContextClasses;
using System.Data.SqlClient;

namespace BolsaTalentos.BLL
{
    public class Aplicacion
    {
        // Campos
        private int id;
        private bool siActiva;
        private string comentario;
        private Vacante vacanteAplicada;
        private UsuarioEgresado aplicante;
        private DateTime fechaPublicacion;

        // Propiedades
        public int ID
        {
            get { return this.id; }
        }
        public bool SiActiva
        {
            get { return this.siActiva; }
            set { this.siActiva = value; }
        }
        public string Comentario
        {
            get { return this.comentario; }
            set { this.comentario = value.Trim(); }
        }
        public Vacante VacanteAplicada
        {
            get
            {
                if (this.vacanteAplicada == null)
                {
                    this.vacanteAplicada = Vacante.GetVacanteByAplicacionID(this.ID);
                }
                return this.vacanteAplicada;
            }
            set { this.vacanteAplicada = value; }
        }
        public UsuarioEgresado Aplicante
        {
            get
            {
                if (this.aplicante == null)
                {
                    this.aplicante = UsuarioEgresado.GetAplicanteByAplicacionID(this.ID);
                }
                return this.aplicante;
            }
            set { this.aplicante = value; }
        }
        public DateTime FechaPublicacion
        {
            get { return this.fechaPublicacion; }
        }

        public Aplicacion(int IDToSearch)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            try
            {
                DataContextClasses.Aplicacione Apl = (from a in DB.Aplicaciones
                                                       where a.ID == IDToSearch
                                                       select a).First();

                this.id = Apl.ID;
                this.siActiva = Apl.Activa;
                this.comentario = Apl.Comentario;
                this.fechaPublicacion = Apl.FechaPublicacion;
                this.vacanteAplicada = null;
                this.aplicante = null;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal aplicacion\n" + SqlEx.Message);
            }
        }
        public Aplicacion(int VacanteID, int EgresadoID, string Comentario)
        {
            this.siActiva = true;
            this.comentario = Comentario;
            this.fechaPublicacion = DateTime.Now;
            this.vacanteAplicada = new Vacante(VacanteID);
            this.aplicante = new UsuarioEgresado(EgresadoID);
        }

        public void Insertar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            DataContextClasses.Aplicacione AplicacionToInsert = new DataContextClasses.Aplicacione();
            try
            {
                AplicacionToInsert.Activa = this.siActiva;
                AplicacionToInsert.Comentario = this.comentario;
                AplicacionToInsert.FechaPublicacion = this.fechaPublicacion;
                AplicacionToInsert.ID_Vacante = this.VacanteAplicada.ID;
                AplicacionToInsert.ID_Egresado = this.Aplicante.ID;

                DB.Aplicaciones.InsertOnSubmit(AplicacionToInsert);
                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la base de datos\n" + SqlEx.Message);
            }
        }
        public void Actualizar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            try
            {
                DataContextClasses.Aplicacione Aplicacion = (from a in DB.Aplicaciones
                                                              where a.ID == this.id
                                                              select a).First();
                Aplicacion.ID = this.id;
                Aplicacion.Activa = this.siActiva;
                Aplicacion.Comentario = this.comentario;
                Aplicacion.FechaPublicacion = this.fechaPublicacion;
                Aplicacion.ID_Vacante = this.VacanteAplicada.ID;
                Aplicacion.ID_Egresado = this.Aplicante.ID;

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + SqlEx.Message);
            }
        }

        public void ToggleActivation() 
        {
            try
            {
                this.siActiva = !(this.siActiva);
                this.Actualizar();
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }

        public static List<Aplicacion> GetAplicacionesByVacanteID(int VacanteID)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            var Aplicaciones = (from a in DB.Aplicaciones
                                where a.ID_Vacante == VacanteID
                                select a);

            List<Aplicacion> AplicacionesDeVacante = new List<Aplicacion>();

            foreach (var item in Aplicaciones)
            {
                Aplicacion AplicacionAIntroducir = new Aplicacion(item.ID);
                AplicacionesDeVacante.Add(AplicacionAIntroducir);
            }
            return AplicacionesDeVacante;

            //List<> a = new List(Aplicaciones.ToList())
            //Aplicaciones.ToList();
            //return new List<Aplicacion>(Aplicaciones.);
            //return Aplicaciones.ToList<Aplicacion>();
        }

        //public static ArrayList GetAplicacionesByVacanteID(int VacanteID)
        //{
        //    DataClassesDataContext DB = new DataClassesDataContext();

        //    var Aplicaciones = (from a in DB.Aplicacions
        //                        where a.ID_Vacante == VacanteID
        //                        select a);
        //    //List<> a = new List(Aplicaciones.ToList())
        ////    Aplicaciones.ToList();
        //    return new ArrayList(Aplicaciones.ToList());
        //}

        public static List<Aplicacion> GetAplicacionesByUserID(int EgresadoID)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            var Aplicaciones = (from a in DB.Aplicaciones
                                where a.ID_Egresado == EgresadoID
                                select a);

            List<Aplicacion> AplicacionesDeEgresado = new List<Aplicacion>();

            foreach (var item in Aplicaciones)
            {
                Aplicacion AplicacionAIntroducir = new Aplicacion(item.ID);
                AplicacionesDeEgresado.Add(AplicacionAIntroducir);
            }
            return AplicacionesDeEgresado;
        }
    }
}
